//
//  main.c
//  进制查表法
//
//  Created by szcq on 2021/4/23.
//

#include <stdio.h>
void printBinary(int value);
void printOct(int value);
void printHex(int value);
int main(int argc, const char * argv[]) {

    int num = 10;
    // 0000 0000 0000 0000 0000 0000 0000 1010
    /**
     输出其  二进制，八进制，十六进制 的值
     */
    
//    printBinary(num);
//    printOct(num);
    printHex(num);
    
    return 0;
}

void printHex(int value) {
    // 1.定义十六进制的进制表  一定要按照顺序
    char form[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    // 2.定义接受 十六进制  的字符数组
    char charValues[4] = {'0'};// 4个 二进制 => 1个 十六进制；二进制一共 32位，所以十六进制  一共 4位
    // 3.定义 接受 十六进制 字符的 索引，从低位开始
    int index = 4;
    
    while (value != 0) {
        // 4.1  将传进来的value & 15，获取到 对应 form 的索引值
        int res = value & 15; // 15 : 00000000 00000000 00000000 0000 1111
        // 4.2  将得到的索引值 根据 form 里的元素 去除对应的字符
        char destinationValue = form[res];
        index -- ;
        charValues[index] = destinationValue;
        //4.3 将传进来的值  右移 四位
        value = value >> 4;
    }
    // 4.打印结果
    for (int i = index; i < 4; i++) {
        printf("%c", charValues[i]);
    }
    //输出结果 : 12
    printf("\n");
}


void printOct(int value) {
    // 1.定义八进制的进制表  一定要按照顺序
    char form[8] = {'0','1','2','3','4','5','6','7'};
    // 2.定义接受八进制的字符数组
    char charValues[11] = {'0'};// 3个 二进制  =>  1个八进制 ; 二进制 一共 32位，所以 八进制一共 11位
    // 3.定义接受 八进制 数据的索引
    int index = 11;
    while (value != 0) {
        // 4.1 将传进来的值  & 7 得出 form 表里 对应 索引 的值。
        int res = value & 7 ; // 7 : 00000000 00000000 00000000 00000111
        // 4.2 去除 对应 索引 的字符，并赋值给 低位
        char determinValue = form[res];
        index -- ;
        charValues[index] = determinValue;
        //4.3 将传进来的值  右移 三位
        value = value >> 3;
    }
    
    // 4.打印结果
    for (int i = index; i < 11; i++) {
        printf("%c", charValues[i]);
    }
    //输出结果 : 12
    printf("\n");
}

void printBinary(int value) {
    //1、定义二进制的进制表
    char form[2] = {'0','1'};
    //2、定义可以接受二进制的数组
    char binaryArr[32] = {'0'}; //32 表示 二进制数据  在 64位 操作系统里的位数
    //3、定义 接受二进制数据的  索引
    int index = 32;
    
    while (value != 0) {
        // 4.1 将传进来的值 & 1  得出 form 表里的对应 索引的值，。注意form 表里  顺序 一定要有序
        int res = value & 1;// 1: 00000000 00000000 00000000 00000001
        // 4.2 利用取出来得值到表中查询对应的结果
        char c = form[res];
        index -- ;//先取出来的数据 也应放在低位
        binaryArr[index] = c;//赋值
        // 4.移除二进制被取过的1位
        value = value >> 1;  //右移 1 位
    }
    // 4.打印结果
    for (int i = index; i < 32; i++) {
        printf("%c", binaryArr[i]);
    }
    //1010
    printf("\n");
}
